package com.yunpeng.aidevice.dao.service;

import com.yunpeng.aidevice.common.dto.save.OrgSaveDTO;
import com.yunpeng.aidevice.dao.model.entity.MerchantDO;
import com.yunpeng.aidevice.dao.model.entity.OrganizationDO;

import java.util.Date;
import java.util.List;

/**
 * IOrganizationService
 *
 * @author : Moore(hemw)
 * @date : 2020-04-08
 */
public interface IOrganizationService {

    /**
     * 获取顶级节点
     *
     * @param rootPath     节点路径
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    OrganizationDO getRoot(String rootPath, String merchantCode, String tenantCode);

    /**
     * 获取节点
     *
     * @param nodePath     节点路径
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    OrganizationDO getNode(String nodePath, String merchantCode, String tenantCode);

    /**
         * 获取节点
         *
         * @param nodeCode     节点代码
         * @param merchantCode 商户代码
         * @param tenantCode   租户代码
         * @return
         */
    OrganizationDO getByCode(String nodeCode, String merchantCode, String tenantCode);

    /**
     * 新增节点
     *
     * @param orgSaveDTO   节点保存信息
     * @param operatorCode 操作人代码
     * @param parentNode   父节点
     * @return
     */
    String addNewNode(OrgSaveDTO orgSaveDTO, String operatorCode, OrganizationDO parentNode);

    /**
     * 根据节点路径左匹配，查询出所有下级节点和其本身
     *
     * @param nodePath     节点路径
     * @param containSelf  是否包含本身
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    List<OrganizationDO> queryNodeListByPath(String nodePath, Boolean containSelf, String merchantCode, String tenantCode);

    /**
     * 删除节点
     *
     * @param nodeCode
     * @return
     */
    Boolean removeOrganizationNode(String nodeCode);

    /**
     * 统计权限关联组织机构数量
     *
     * @param permissionCode 二选一
     * @param orgCode        二选一
     * @param now            当前时间
     * @return
     */
    Integer countPermissionRelation(String permissionCode, String orgCode, Date now);

    /**
     * 更新组织机构信息
     *
     * @param orgSaveDTO   组织机构信息
     * @param operatorCode 操作人代码
     * @param parentNode   父节点
     * @return
     */
    Boolean updateOrganization(OrgSaveDTO orgSaveDTO, String operatorCode, OrganizationDO parentNode);

    /**
     * 禁用组织
     *
     * @param operatorCode 操作人代码
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param nodeCode     节点代码
     * @return
     */
    Boolean disable(String operatorCode, String merchantCode, String tenantCode, String nodeCode);

    /**
     * 启用组织
     *
     * @param operatorCode 操作人代码
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param nodeCode     节点代码
     * @return
     */
    Boolean enable(String operatorCode, String merchantCode, String tenantCode, String nodeCode);

    /**
     * 根据组织编号获取组织
     *
     * @param number       组织编号
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    OrganizationDO getByNumber(String number, String merchantCode, String tenantCode);

    /**
     * 获取设备关联的组织代码
     *
     * @param deviceCode 设备代码
     * @return
     */
    List<String> getRelationOrgCodesByDevice(String deviceCode);

    /**
     * 获取所有商户下的组织部门（最大2000）
     *
     * @param merchantCode
     * @param tenantCode
     * @return
     */
    List<OrganizationDO> getAllMerchantOrgList(String merchantCode, String tenantCode);

    /**
     * 创建商户默认组织
     *
     * @param merchantDO
     * @param operatorCode
     * @return
     */
    String addMerchantDefaultOrg(MerchantDO merchantDO, String operatorCode);
}
